package com.zb.nio.buffer;

import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.IntBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;

public class BufferDemo {
    public static void main(String[] args) throws IOException {
        // bufferTest();
        intBufferTest();
    }

    /**
     * buffer读写
     * @throws IOException
     */
    public static void bufferTest() throws IOException {
        // 目标文件路径
        String filePaht = ".\\src\\main\\resources\\03.txt";
        // 定义文件
        RandomAccessFile file = new RandomAccessFile("file/03.txt", "rw");
        // 获取通道
        FileChannel channel = file.getChannel();

        // 定义接收缓冲区,先从通道写到缓冲区
        ByteBuffer buf = ByteBuffer.allocate(32);

        // 单次读取数量
        int readNum = 0;
        // 如果没有读到文件结尾就循环读取；把读到的数据写入buf
        while((readNum = channel.read(buf)) != -1){
            // 读取反转：由写入转为读取
            buf.flip();
            // 如果buf中有数据
            if (buf.hasRemaining()){
                // 输出数据：utf8编码
                System.out.print(Charset.forName("utf8").decode(buf));
            }
            // 重置buf
            buf.clear();
            // buf.compact();
        }
        // 在关闭通道前，调用file，输出正常
        System.out.println(file.length());
        // file.close();
        // 关闭通道：通道关闭后，file也会关闭
        channel.close();

        // 关闭通道后，再调用file，会出异常；因为file也关闭了
        // System.out.println(file.length());
    }

    /**
     * IntBuffer读写
     */
    public static void intBufferTest() {
        // 定义buffer
        IntBuffer buf = IntBuffer.allocate(8);
        // 写入buffer
        for (int i = 0; i < buf.capacity(); i++) {
            buf.put(2 * (i + 1));
        }
        // 读写反转
        buf.flip();
        // 读取
        while (buf.hasRemaining()) {
            System.out.print(buf.get() + " ");
        }
    }
}
